#/usr/bin/env python
#-*- coding: utf-8 -*-

import mimetypes
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
from posixpath import splitext
from os import curdir,path,fstat,sep
from sys import argv
from pagina import PaginaID,PaginaLista
from database import BancoDados

try:
    PORTA = int(argv[1])
except IndexError:
    PORTA = 8000
except ValueError:
    print u'Porta inválida'
    exit()

banco_dados = BancoDados()

class WebServer(BaseHTTPRequestHandler):

    def do_GET(self):
        #self.wfile.write(self.path[1:])

        is_file=True
        caminho = curdir+self.path
        lista = self.path[1:].split('?') # Dividir a string de requisicao

        if lista[0]=='buscar':
            
            dici=dict(zip(map(lambda x:x.split('=')[0],lista[1:]),map(lambda x:x.split('=')[1],lista[1:]))) # Criar o dicionario com a variavel e o valor
            is_file=False
            id = dici.get('id',-1)
                        
            if id!=-1:
               
                info = banco_dados.select_id(id)
                if not info:
                     self.send_error(404,'Arquivo não encontrado')
                     return

                info = info[0]
                    
                info= dict(zip(('id','nome','cidade','local','endereco','descricao','horario','mapa','foto'),info))
                pagina = PaginaID('resultado.html','TourismPE')
                f=pagina.renderizar(info)
                
            else:
               
                #self.wfile.write(dici['local'])
                local=dici['local']
                pontos_turisticos = banco_dados.select_local(local)
                
                # Informar que não tem HTML se for de outro local
                pagina = PaginaLista('lista.html','TourismPE')
                f=pagina.renderizar(local,pontos_turisticos)
                #print locais
                
                
                
                

            #pagina = PaginaID('pagina.html','teste','Paulista',2)
            #f = pagina.renderizar({'title':'Kajiki is teh awesome!', 'repetitions':3})

        try:
            if is_file:
                f = open(caminho,'rb')
                tipo = self.descobrir_arquivo(caminho) # Descobrir qual tipo é o arquivo
                size = fstat(f.fileno()) # Informações do arquivo
            else:
                tipo = 'text/html'
                size = len(f)
                
            self.send_response(200)          
            self.send_header('Content-type',tipo) # Tipo do arquivo
            self.send_header('Content-Length',size)
            #statinfo.st_mtime
            self.end_headers()
            
            for buf in f:
                self.wfile.write(buf)

            if is_file:
                f.close()
                
            return
                   
        except IOError:
            self.send_error(404,'Arquivo não encontrado: %s' % self.path)

    def descobrir_arquivo(self,arquivo):     
        nome,terminacao = splitext(arquivo)
        mime = mimetypes.types_map[terminacao] # Dicionário com os tipos de arquivos
        return mime or 'octet-stream'


if __name__=='__main__':
    try:
        mimetypes.init()
        server = HTTPServer(('',PORTA),WebServer)
        print 'Servidor iniciado na porta %d...'%PORTA
        server.serve_forever()
    except KeyboardInterrupt:
        print '^C recebido, desligando o servidor.'
        server.socket.close()
        banco_dados.conexao.close()
